vlwkaos' digital garden

Raspberry Pi 3 B+ 서버 세팅 (3)

node.js 설치

Node.js 11 버전을 설치하기 위해 다음 커맨드를 입력한다.

sudo apt-get update
curl -sL https://deb.nodesource.com/setup_11.x | bash -
sudo apt-get install -y nodejs

node.js 와 npm이 제대로 설치되었는지 확인하기 위해서 다음 커맨드를 입력한다.

node -v
npm -v

PM2 설치

노드 앱을 여러 개 실행하기 위해, 그리고 백그라운드에 앱을 상주시키기 위해서는 PM2를 이용해야 한다. 다음 커맨드로 설치하자: sudo npm install -g pm2

이제 pm2 start server.js 와 같은 커맨드로 nodejs 앱을 여러 개 실행할 수 있다. PM2는 앱이 갑자기 죽을 경우 재시작해주는 기능도 있다. 부팅 시에 자동으로 켜지게 하고프기 때문에 pm2 startup systemd 커맨드를 입력했다.

위의 커맨드를 입력하면 '시작 설정을 하고 싶으면 다음 커맨드를 입력'하라고 하면서 뭔가를 던진다. 그걸 그대로 복사해서 입력해주자. 그러면 부팅 시 PM2 시작 설정이 된 것이다. 그런데 내가 켜고 싶은 앱이 뭔지 아직 지정을 안했다라는 생각이 들 것이다. PM2는 덤프에서 확인 가능한 앱 목록을 이용해 위의 기능을 수행한다.

덤프파일을 만드는 건 간단하다. 부팅 시 켜고 싶은 node.js 앱들을 PM2를 이용하여 시작해준다. 그 후에 pm2 save 를 입력하기만 하면 된다.

마지막으로 pm2 list, pm2 status, pm2 show 커맨드를 입력하면 현재 실행 중인 앱의 상태를 확인할 수 있다.

Nginx 설치

Nginx 는 Reverse Proxy 서비스이다. Nginx를 이용하면 하나의 서버로 다수의 서버를 운용하는 것 처럼 설정할 수 있다. 쉽게 말하면 포트포워딩의 반대이다. 예를 들면 80번 포트 하나만 열어 두고 내부에서 주소나 도메인 이름에 따라 다른 포트에서 서비스하는 웹 서버로 연결해줄 수 있는 것이다. Nginx의 이점이라고 하면 여러 포트를 열어두지 않아도 되기 때문에 그냥 서비스하는 것보다 한 층의 보안이 더 생긴다는 점.

아래를 입력하여 설치해준다.

sudo apt update
sudo apt install nginx

Nginx는 설치가 끝나자 마자 바로 실행 된다. 라즈베리파이의 IP주소를 브라우저에 치고 들어가 보면 웰컴 페이지가 뜬다. 열려있는 포트의 기본값이 80이기 때문에 아무 설정을 하지 않아도 뜨는 것이다.

그런데 웰컴 페이지 대신에 내가 원하는 앱을 띄우고 싶으니까 설정을 해줘야 된다. /etc/nginx/sites-available/default 파일을 수정 해야된다. 대부분의 설정은 여기서 한다고 보면 된다. 경로를 외워두자. 내용을 살펴보면 server 섹션에 location / { ... } 이런 부분이 있을 것이다. 괄호 안에 다음으로 채우자.

proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;

이것은 80번 포트를 듣고있는 서버에 / 라는 하위주소로 요청이 들어오면 3000 번 포트를 사용하는 앱으로 연결시키라는 설정이다.

sudo nginx -t 로 이상이 없는지 확인한 뒤 sudo systemctl restart nginx 로 Nginx를 재시작 해주자.

아마 node.js 나 PM2 로 3000번 포트를 사용하는 앱을 실행하면 그리로 접속이 될 것이다.

안전한 https 연결

민감한 개인 정보가 포함된 위키를 호스팅 한다면 암호화 없이 공개 네트워크에서 접속하기가 꺼려질 수 밖에 없다. 그러니까 우리는 SSL을 통한 안전한 접속을 하고싶다.

여기서는 SSL을 받는 제일 간단한 방법을 이용할 것이다. 바로 (과거 let's encrypt) dehydrate를 이용하는 방법이다.

먼저 git clone https://github.com/lukas2511/dehydrated.git 로 dehydrate를 다운받는다. 받고나서 dehydrate 폴더로 들어가 domains.txt 파일을 안에 만들고 내용물에는 안전한 연결을 시도할 도메인 주소를 적는다. 예를 들자면 나는 아직 도메인 주소를 따로 설정하지 않았기 때문에 이전의 글에서 duckdns로 만든 ddns 주소만 갖고있다. 그걸 (예: example.duckdns.org) 넣고 저장할 것이다. 같은 인증서를 사용하는 웹사이트의 도메인을 더 추가 하고 싶다면 띄어쓰기를 한 후 더 추가하면 된다.

그리고 config 라는 파일도 필요하다. 없으면 만들고 있으면 파일을 열고 다음 내용이 포함되도록 수정한다.

# Which challenge should be used? Currently http-01 and dns-01 are supported
CHALLENGETYPE="dns-01"

# Script to execute the DNS challenge and run after cert generation
HOOK="${BASEDIR}/hook.sh"

PM2에서 Tiddlywiki 실행하기

WIP

Referred in

Raspberry Pi 3 B+ 서버 세팅 (3)